frp服务的使用
目录
前言
在内网环境下,主机都是与互联网隔绝的,如果我们想要在公网访问一个内网的设备,其中一个办法就是使用内网穿透技术,它解决了家庭宽带、企业局域网等环境下无法从外部直接访问内部服务的问题。
FRP(Fast Reverse Proxy)
是一个高性能的开源内网穿透工具,使用 Go 语言开发。它通过在公网服务器上运行
frps
(服务端),在内网设备上运行
frpc
(客户端),建立反向连接,实现从公网访问内网服务(如 SSH、Web、数据库等)。配置灵活,支持 TCP、UDP、HTTP、HTTPS 等多种协议,适用于远程管理、自建服务、IoT 等场景。
下载
在 Github release 页面下载最新的版本:
https://github.com/fatedier/frp/releases
根据服务器系统,选择对应的压缩包,比如我下载的是: frp_0.63.0_linux_amd64.tar.gz
解压后,有以下文件:
frpc frpc.toml frps frps.toml LICENSE
frpc 和 frpc.toml 是客户端的程序和配置文件模板。
frps 和 frps.toml 是服务器端的程序和配置文件模板。
服务端部署
服务器需要至少打开一个端口(防火墙或者安全组)的外网访问。
服务器和客户端就是通过这个端口(官方默认是 7000)建立连接。
把 frps 和 frps.toml 放置到服务器的目录下(比如:/opt/frp),然后修改配置文件 frps.toml:
# 必须要配置的
bindPort = 7000
auth.token = "your password"
# dashboard 可有可无
webServer.addr = "127.0.0.1"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "your password"
bindPort 就是服务器与客户端通信的端口,auth.token 表示连接的验证 token。
如果没有这个 token,任何人只要知道你的 frps 的公网 IP 和端口,就可以连接你的 frp 服务,所以一定要指定一个 auth.token。
webServer 的配置,主要是给服务器端一个可以查看的 web dashboard 页面,可有可无。
配置好文件后,这里可以把 frps 加入到 systemd 进行管理,官网的 systemd service 有些简单,没有指定用户和重启策略,我的版本是:
# /etc/systemd/system/frps.service
[Unit]
Description=Frp server
After=network-online.target
Wants=network-online.target
StartLimitIntervalSec=60s
StartLimitBurst=3
[Service]
Type=simple
WorkingDirectory=/opt/frp
User=frp
Group=frp
ExecStart=/opt/frp/frps -c /opt/frp/frps.toml
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
这里我指定运行的用户和属组是 frp,所以还需要建立一个专门运行 frp 服务的系统级用户(和 nginx 的 www-data 类似):
sudo useradd --system --no-create-home --shell /usr/sbin/nologin frp
然后把 /opt/frp 的目录权限指定给 frp 用户:
sudo chown -R frp:frp /opt/frp
到此,所有服务器端的 frps 准备工作完成,启动 frps 服务:
sudo systemctl daemon-reload
sudo systemctl enable frps.service
sudo systemctl start frps.service
客户端部署
客户端和服务器端的部署几乎一模一样,把 frpc 和 frpc.toml 放到 /opt/frp 下,然后配置 frpc.service:
# /etc/systemd/system/frpc.service
[Unit]
Description=Frp client
After=network-online.target
Wants=network-online.target
StartLimitIntervalSec=60s
StartLimitBurst=3
[Service]
Type=simple
WorkingDirectory=/opt/frp
User=frp
Group=frp
ExecStart=/opt/frp/frpc -c /opt/frp/frpc.toml
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
然后创建 frp 用户,更改 /opt/frp 权限给 frp 用户,唯一不同的是 frpc.toml 的内容,如下:
serverAddr = "your frps server ip address"
serverPort = 7000
auth.token="your password"
[[proxies]]
name = "my-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 7001
serverAddr 就是部署了 frps 服务器的 ip 地址或者域名,serverPort 和 auth.token 和服务器 frps.toml 里面保持一致,下面的 [[proxies]] 小节就是专门配置代理本地的服务到公网去。
这里的 proxies 配置是把内网机器的 ssh 的 22 端口映射到公网服务器的 7001 端口。
配置好 frpc.toml 后,启动:
sudo systemctl daemon-reload
sudo systemctl enable frpc.service
sudo systemctl start frpc.service
验证 ssh 是否可以连接,假设我这里的公网 ip 是 1.2.3.4,ssh 用户名是 alice,那么 ssh 命令如下:
ssh -p 7001 alice@1.2.3.4
参考
- https://github.com/fatedier/frp
- https://gofrp.org/zh-cn/docs/features/common/ui/
- https://gofrp.org/zh-cn/docs/setup/systemd/